import face_recognition
import cv2
import numpy as np

#这是一个在你的摄像头上的实时视频上运行人脸识别的演示。它比
#其他示例，但它包含了一些基本的性能调整，以使事情运行得更快：
#1.以1/4分辨率处理每个视频帧(尽管仍以完全分辨率显示)
#2.只检测其他每一帧视频中的人脸。

#请注意：这个示例只要求安装OpenCV(‘cv 2’库)才能读取您的网络摄像头。
#OpenCV*不需要使用面部识别库。只有当您想运行此程序时才需要它
#特定的演示。如果您在安装它时遇到问题，请尝试其他不需要它的演示程序。

#获取对摄像头#0的引用(默认的)
video_capture = cv2.VideoCapture(0)

#加载一个示例图片并学习如何识别它。
obama_image = face_recognition.load_image_file("obama.jpg")
obama_face_encoding = face_recognition.face_encodings(obama_image)[0]

#加载第二个示例图片并学习如何识别它。
biden_image = face_recognition.load_image_file("biden.jpg")
biden_face_encoding = face_recognition.face_encodings(biden_image)[0]

#创建已知的脸编码数组及其名称
known_face_encodings = [
    obama_face_encoding,
    biden_face_encoding
]
known_face_names = [
    "Barack Obama",
    "Joe Biden"
]

#初始化变量
face_locations = []
face_encodings = []
face_names = []
process_this_frame = True

while True:
    #抓取一帧视频
    ret, frame = video_capture.read()

    #将视频帧调整为1/4大小，以提高人脸识别处理速度
    small_frame = cv2.resize(frame, (0, 0), fx=0.25, fy=0.25)

    #将图像从BGR颜色(OpenCV使用的)转换为RGB颜色(人脸识别使用)
    rgb_small_frame = small_frame[:, :, ::-1]

    #只处理其他每一帧视频以节省时间
    if process_this_frame:
        #查找当前视频帧中的所有脸和脸编码
        face_locations = face_recognition.face_locations(rgb_small_frame)
        face_encodings = face_recognition.face_encodings(rgb_small_frame, face_locations)

        face_names = []
        for face_encoding in face_encodings:
            #看看这张脸是否与已知的脸相匹配
            matches = face_recognition.compare_faces(known_face_encodings, face_encoding)
            name = "Unknown"

            #如果在已知_Face_ENCONDS中找到匹配，只需使用第一个。
            #如果匹配中为真：
            #First_Match_index=Mates.index(真)
            #name=已知_FACE_NAME[First_Match_index]

            #或者，使用与新面孔距离最小的已知面孔
            face_distances = face_recognition.face_distance(known_face_encodings, face_encoding)
            best_match_index = np.argmin(face_distances)
            if matches[best_match_index]:
                name = known_face_names[best_match_index]

            face_names.append(name)

    process_this_frame = not process_this_frame


    # Display the results
    for (top, right, bottom, left), name in zip(face_locations, face_names):
        #自我们检测到的帧被缩放到1/4大小以来，向后调整面部位置
        top *= 4
        right *= 4
        bottom *= 4
        left *= 4

        #在脸上画一个盒子
        cv2.rectangle(frame, (left, top), (right, bottom), (0, 0, 255), 2)

        #画一个在脸下面有名字的标签
        cv2.rectangle(frame, (left, bottom - 35), (right, bottom), (0, 0, 255), cv2.FILLED)
        font = cv2.FONT_HERSHEY_DUPLEX
        cv2.putText(frame, name, (left + 6, bottom - 6), font, 1.0, (255, 255, 255), 1)

    #显示结果图像
    cv2.imshow('Video', frame)

    #点击‘q’在键盘上退出！
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# Release handle to the webcam
video_capture.release()
cv2.destroyAllWindows()